package TP3;

import TP1.TDA.PilaTDA;
import TP2.Utils;
import TP2.TDA.ConjuntoTDA;
import TP2.implementation.ConjuntoTamNoAcotListaImpl1;
import TP2.implementation.PilaListaImpl;

public class PilaTDAMetodos {

	public static void main(String[] args) {
		runTests();
	}
	
	private static void runTests() {
		testPilaCapicua();
		testEliminarRepetidos();
		testRepetidos();
	}
	
	private static void testPilaCapicua() {
		System.out.println("\nInicio de test pilaCapicua:");
		
		PilaTDA pila = new PilaListaImpl();
		pila.inicializar();
		
		pila.apilar(1);
		pila.apilar(3);
		pila.apilar(1);
		pila.apilar(5);
		
		System.out.println("Pila antes:");
		Utils.imprimirPila(pila);
		
		System.out.println("capicuas? " + (pilaCapicua(pila) ? "Si" : "No"));
		
		pila.desapilar();

		System.out.println("Pila despues:");
		Utils.imprimirPila(pila);

		System.out.println("capicuas? " + (pilaCapicua(pila) ? "Si" : "No"));
		
		System.out.println("Fin de test pilaCapicua:");
	}
	
	private static void testEliminarRepetidos() {
		System.out.println("\nInicio de test eliminarRepetidos:");
		
		PilaTDA pila = new PilaListaImpl();
		pila.inicializar();
		
		pila.apilar(8);
		pila.apilar(0);
		pila.apilar(6);
		pila.apilar(1);		
		pila.apilar(4);		
		pila.apilar(7);		
		pila.apilar(5);		
		pila.apilar(0);		
		pila.apilar(4);
		pila.apilar(7);
		
		System.out.println("Pila antes:");
		Utils.imprimirPila(pila);
		
		eliminarRepetidos(pila);

		System.out.println("Pila despues:");
		Utils.imprimirPila(pila);
		
		System.out.println("Fin de test eliminarRepetidos:");
	}
	
	private static void testRepetidos() {
		System.out.println("\nInicio de test repetidos:");
		
		PilaTDA pila = new PilaListaImpl();
		pila.inicializar();
		
		pila.apilar(8);
		pila.apilar(0);
		pila.apilar(6);
		pila.apilar(1);		
		pila.apilar(4);		
		pila.apilar(7);		
		pila.apilar(5);		
		pila.apilar(0);		
		pila.apilar(4);
		pila.apilar(7);
		
		System.out.println("Pila");
		Utils.imprimirPila(pila);
		
		ConjuntoTDA repetidos = repetidos(pila);

		System.out.println("Repetidos:");
		Utils.imprimirConjunto(repetidos);
		
		System.out.println("Fin de test repetidos:");
	}
	
	private static boolean pilaCapicua(PilaTDA pila) {
		PilaTDA aux = new PilaListaImpl();
		aux.inicializar();
		PilaTDA auxInv = new PilaListaImpl();
		auxInv.inicializar();
		
		int c, i = 0;
		c = Utils.copiarPila(pila, aux);
		Utils.copiarPilaInvirtiendo(pila, auxInv);
		
		boolean capicuas = true;
		while(i < (c/2) && capicuas) {
			if(aux.tope() != auxInv.tope()) {
				capicuas = false;
			}
			aux.desapilar();
			auxInv.desapilar();
			i++;
		}
		return capicuas;
	}
	
	private static void eliminarRepetidos(PilaTDA pila) {
		PilaTDA aux = new PilaListaImpl();
		aux.inicializar();
		ConjuntoTDA conj = new ConjuntoTamNoAcotListaImpl1();
		conj.inicializar();
		
		Utils.pasarPila(pila, aux);
		
		while(!aux.vacia()) {
			if(!conj.pertenece(aux.tope())) {
				pila.apilar(aux.tope());
				conj.agregar(aux.tope());
			}
			aux.desapilar();
		}
	}

	private static ConjuntoTDA repetidos(PilaTDA pila) {
		ConjuntoTDA aux = new ConjuntoTamNoAcotListaImpl1();
		aux.inicializar();
		ConjuntoTDA ret = new ConjuntoTamNoAcotListaImpl1();
		ret.inicializar();
		PilaTDA pilaAux = new PilaListaImpl();		
		pilaAux.inicializar();
		
		Utils.copiarPila(pila, pilaAux);
		
		while(!pilaAux.vacia()) {
			if(aux.pertenece(pilaAux.tope())) {
				ret.agregar(pilaAux.tope());
			}
			aux.agregar(pilaAux.tope());
			pilaAux.desapilar();
		}
		
		return ret;
	}
}
